import java.math.RoundingMode
import java.text.DecimalFormat
import java.text.NumberFormat

/**
 * 分转万：保留num位小数，去掉末位的0和点
 *  @param num 保留小数
 */
fun Number?.fen2Wan(num: Int = 6): String {
    if (this == null) {
        return "0"
    }
    var ss = String.format("%.${num}f", this.toDouble() / 1000000.0)
    if (ss.indexOf(".") > 0) {
        ss = ss.replace("0+?$".toRegex(), "") //去掉后面无用的零
        ss = ss.replace("[.]$".toRegex(), "") //如小数点后面全是零则去掉小数点
    }
    return ss
}

//截断
fun Number?.fen2WanCut(): String? {
    if (this == null) {
        return "0"
    }
    var num = this.toDouble() / 1000000.0
    val format = DecimalFormat("0.##")
    //未保留小数的舍弃规则，RoundingMode.FLOOR表示直接舍弃。
    format.roundingMode = RoundingMode.FLOOR
    return format.format(num)
}

/**
 * 分转元：保留num位小数，去掉末位的0和点
 * @param num 保留小数
 */
fun Number?.fen2Yuan(num: Int? = 2): String {
    if (this == null) {
        return "0"
    }
    var ss = String.format("%.${num}f", this.toDouble() / 100.0)
    if (ss.indexOf(".") > 0) {
        ss = ss.replace("0+?$".toRegex(), "") //去掉后面无用的零
        ss = ss.replace("[.]$".toRegex(), "") //如小数点后面全是零则去掉小数点
    }
    return ss
}

/**
 * 元转分，去掉小数点后面所有的数字
 */
fun Number?.yuan2fen(): Long {
    if (this == null || this == 0) {
        return 0
    }
    val nf = NumberFormat.getInstance()
    nf.isGroupingUsed = false //不显示科学计数法
    var ss = nf.format(this.toDouble() * 100)
    if (ss.indexOf(".") > 0) {
        ss = ss.substring(0, ss.indexOf("."))
    }
    return ss.toLong()
}

/**
 * 平方厘米转平方米
 * 保留2位小数，去掉末位的0和点
 */
fun Number?.sqCM2sqM(): String {
    if (this == null) {
        return "0"
    }
    var ss = String.format("%.2f", this.toDouble() / 10000.0)
    if (ss.indexOf(".") > 0) {
        ss = ss.replace("0+?$".toRegex(), "") //去掉后面无用的零
        ss = ss.replace("[.]$".toRegex(), "") //如小数点后面全是零则去掉小数点
    }
    return ss
}


/**
 * 是 null 或者 0
 */
fun Number?.isNullOrZero(): Boolean {
    return this == null || this == 0
}

/**
 * 不是null且不为0
 */
fun Number?.notNullOrZero(): Boolean {
    return !this.isNullOrZero()
}

fun Number?.largeZero(): Boolean {
    if (this == null) return false
    if (this is Long) return this > 0
    if (this is Int) return this > 0
    if (this is Double) return this > 0
    if (this is Float) return this > 0
    return false
}

fun Number?.largeNumber(num: Number): Boolean {
    if (this == null) return false
    if (this is Long) return this > num.toLong()
    if (this is Int) return this > num.toInt()
    if (this is Double) return this > num.toDouble()
    if (this is Float) return this > num.toFloat()
    return false
}
